﻿Imports System.Text
Imports System.Xml

Namespace Objects

    Public Class PrintLeveringsbonDocument
        Inherits PrintVerkoopDocument

        Private _cashBetaaldZelfsAlsTotaalNietNulIs As Boolean

#Region "Protected properties"

        Protected Overrides ReadOnly Property FooterLineCount() As Integer
            Get
                Return 3
            End Get
        End Property

        Protected Overrides ReadOnly Property NaamSjabloon() As String
            Get
                Return "leveringsbon.flo"
            End Get
        End Property

        Protected Overrides ReadOnly Property DetailCount() As Integer
            Get
                If (Utility.IsVerkoopGeannuleerd(_verkoop)) Then
                    ' de leveringsbon is cash betaald en is geannuleerd met een tegengestelde verkoop
                    ' druk alleen de eerste  helft af
                    Return _details.Count \ 2
                Else
                    Return MyBase.DetailCount
                End If
            End Get
        End Property

        Protected Overrides ReadOnly Property SortOrder() As Objects.SortOrder
            Get
                If (Utility.IsVerkoopGeannuleerd(_verkoop)) Then
                    Return Objects.SortOrder.Chronologisch ' zodat de eerste helft afgedrukt wordt en niet de tegengestelde verkoop
                Else
                    Return Objects.SortOrder.PerArtikel
                End If
            End Get
        End Property

#End Region

#Region "Constructor/Initialisatie"

        Public Sub New(ByVal verkoop As ArtikelsDataSet.VerkopenRow, ByVal cashBetaaldZelfsAlsTotaalNietNulIs As Boolean)
            MyBase.New(verkoop)
            _cashBetaaldZelfsAlsTotaalNietNulIs = cashBetaaldZelfsAlsTotaalNietNulIs
        End Sub

#End Region

#Region "Protected methods"

        Protected Overrides Sub InitializePrinter()
            Me.PrinterSettings.PrinterName = Configuratie.Printer
        End Sub

        Protected Overrides Function GetVerkoopsPrintDetail(ByVal detail As VerkoopsDetail, ByVal volgnummerKlant As String) As PrintVerkoopDocument.VerkoopsPrintDetail
            Return New LeveringsbonDetail(detail, Me, volgnummerKlant)
        End Function

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <param name="top">Bovenkantpositie vanaf waar geprint moet worden</param>
        ''' <returns>Bovenkant-positie van de volgende rij in dpi</returns>
        Protected Overrides Function PrintHoofding(ByVal top As Integer) As Integer
            Dim hoofdingBlok As DocumentBlok = GetBlok("hoofding")
            Dim titel As String
            If (_verkoop.IsOmschrijvingNull OrElse String.IsNullOrEmpty(_verkoop.Omschrijving)) Then
                titel = String.Format("LEVERING N°{0}", _verkoop.Id)
            Else
                titel = String.Format("LEVERING N°{0} - {1}", _verkoop.Id, _verkoop.Omschrijving)
            End If
            hoofdingBlok.SetCelTekst("titel", titel & GetTitleSuffix())
            hoofdingBlok.SetCelTekst("datum", String.Format("{0:d/M/yyyy}", _datum))
            hoofdingBlok.SetCelTekst("winkelier", String.Format("Winkelier: {0}", _naamWinkelier))
            hoofdingBlok.SetCelTekst("klant", GetKlantText())

            top = PrintBlok(hoofdingBlok, top)
            Return top
        End Function

        ''' <summary>
        ''' Overschrijf deze methode om iets af te drukken bovenaan vervolgpagina's
        ''' </summary>
        ''' <param name="top">Bovenkantpositie vanaf waar geprint moet worden</param>
        ''' <returns>Bovenkant-positie van de volgende rij in dpi</returns>
        Protected Overrides Function PrintVervolgHoofding(ByVal top As Integer) As Integer
            Dim vervolghoofdingBlok As DocumentBlok = GetBlok("vervolghoofding")
            vervolghoofdingBlok.SetCelTekst("vervolghoofding", String.Format("Vervolg leveringsbon N°{0}", _verkoop.Id) & GetTitleSuffix())
            top = PrintBlok(vervolghoofdingBlok, top)
            Return top
        End Function

        Protected Overrides Sub PrintVoettekst(ByVal top As Integer)
            Dim totaalBlok As DocumentBlok = GetBlok("totaal")

            ' voor cash betaalde leveringsbonnen wordt hier maar de helft van de details opgeteld (de andere helft is tegengesteld)
            Dim totaalBedrag As Decimal = 0D ' niet _totaalBedrag gebruiken, dat is het totaal van alles
            For i As Integer = 0 To DetailCount - 1
                totaalBedrag += (_details(i).VerkoopsDetail.TotaalPrijsZonderStatiegeld + _details(i).VerkoopsDetail.TotaalAfTeDrukkenStatiegeld)
            Next
            totaalBlok.SetCelTekst("totaal", totaalBedrag.ToString("c"))
            top = PrintBlok(totaalBlok, top)

            top = PrintBtwBlok(top)

            Dim kortingspercentage As Decimal = 0D
            If (Not _verkoop.IsKortingspercentageNull) Then
                kortingspercentage = _verkoop.Kortingspercentage
            End If

            If (kortingspercentage <> 0) Then
                Dim totaalVoeding As Decimal = 0D
                Dim totaalVoedingZonderBtw As Decimal = 0D
                Dim totaalKortingMetBtw As Decimal = 0D

                For i As Integer = 0 To Me.DetailCount - 1
                    Dim detailPrint As VerkoopsPrintDetail = _details(i)
                    Dim detail As VerkoopsDetail = detailPrint.VerkoopsDetail
                    Dim artikel As ArtikelsDataSet.ArtikelsRow = detail.DataRow.ArtikelsRow
                    Dim categorie As ArtikelsDataSet.CategorieenRow = artikel.CategorieenRow
                    If (categorie.Categorie.ToLower = "voeding") Then ' alleen voeding
                        totaalVoeding += detail.TotaalPrijsZonderStatiegeld
                        totaalVoedingZonderBtw += detail.TotaalPrijsZonderBtw
                        Dim kortingZonderBtw As Decimal = detail.TotaalPrijsZonderBtw * kortingspercentage / 100D
                        totaalKortingMetBtw += kortingZonderBtw * (100D + Convert.ToDecimal(detail.BTW)) / 100D
                    End If
                Next
                Dim korting As Decimal = totaalVoedingZonderBtw * kortingspercentage / 100D
                ' Dim teBetalen As Decimal = _totaalBedrag - korting
                Dim teBetalen As Decimal = _totaalBedrag - totaalKortingMetBtw

                Dim kortingBlok As DocumentBlok = GetBlok("korting")
                kortingBlok.SetCelTekst("totaalvoeding", totaalVoeding.ToString("c"))
                kortingBlok.SetCelTekst("totaalvoedingzonderbtw", totaalVoedingZonderBtw.ToString("c"))
                kortingBlok.SetCelTekst("kortinglabel", String.Format("Korting {0}% (op het bedrag aan voeding zonder BTW):", _verkoop.KlantenRow.KortingsPercentage.ToString()))
                kortingBlok.SetCelTekst("korting", (-korting).ToString("c"))
                kortingBlok.SetCelTekst("tebetalen", teBetalen.ToString("c"))
                top = PrintBlok(kortingBlok, top)
            End If

            Dim voettekstBlok As DocumentBlok = GetBlok("voettekst")
            If (_cashBetaaldZelfsAlsTotaalNietNulIs OrElse _totaalBedrag = 0D) Then
                ' bij cash betalen worden de artikels nogmaals negatief ingebracht op de leveringsbon, zodat het totaal nul is
                voettekstBlok.SetCelTekst("consignatie", "De leveringsbon werd cash afgerekend. Een factuur is niet nodig.")
            Else
                If (_verkoop.Consignatie) Then
                    voettekstBlok.SetCelTekst("consignatie", _
                        String.Format("De niet verbruikte goederen kunnen tot ten laatste {0:d} teruggebracht worden, daarna worden ze gefactureerd.", _
                                                                           _datum.AddMonths(1)))
                Else
                    voettekstBlok.SetCelTekst("consignatie", "De factuur mag onmiddellijk verzonden worden")
                End If
            End If
            top = PrintBlok(voettekstBlok, top)
        End Sub

        Private Function GetKlantText() As String
            Dim sb As New StringBuilder()
            If (_verkoop.KlantenRow.IsNaamNull()) Then
                sb.AppendLine("Klant zonder naam")
            Else
                sb.AppendLine(_verkoop.KlantenRow.Naam)
            End If
            If (Not _verkoop.KlantenRow.IsAdresNull()) Then
                sb.AppendLine(_verkoop.KlantenRow.Adres)
            End If
            If (Not _verkoop.KlantenRow.IsPostcodeNull() AndAlso Not _verkoop.KlantenRow.IsGemeenteNull()) Then
                sb.Append(_verkoop.KlantenRow.Postcode)
                sb.Append(" ")
                sb.Append(_verkoop.KlantenRow.Gemeente)
            End If
            If (Not _verkoop.KlantenRow.IsBTWnummerNull) Then
                sb.AppendLine()
                sb.Append(_verkoop.KlantenRow.BTWnummer)
            End If
            If (Not _verkoop.KlantenRow.IsGSMNull AndAlso Not String.IsNullOrEmpty(_verkoop.KlantenRow.GSM)) Then
                sb.AppendLine()
                sb.Append(_verkoop.KlantenRow.GSM)
            End If
            If (_verkoop.KlantenRow.IsGSMNull AndAlso Not _verkoop.KlantenRow.IsTelefoonNull AndAlso Not String.IsNullOrEmpty(_verkoop.KlantenRow.Telefoon)) Then
                sb.AppendLine()
                sb.Append(_verkoop.KlantenRow.Telefoon)
            End If
            Return sb.ToString()
        End Function

#End Region

        Protected Class LeveringsbonDetail
            Inherits VerkoopsPrintDetail

            Public Sub New(ByVal verkoopsDetail As VerkoopsDetail, ByVal document As PrintLeveringsbonDocument, ByVal volgnummerKlant As String)
                MyBase.New(verkoopsDetail, document, volgnummerKlant)
            End Sub

            ''' <summary>
            ''' 
            ''' </summary>
            ''' <param name="top">Bovenkant vanaf waar geprint moet worden</param>
            ''' <returns>Bovenkant-positie van de volgende rij in dpi</returns>
            Public Overrides Function Print(ByVal sjabloonRij As DocumentRij, ByVal top As Integer) As Integer

                If (_verkoopsDetail.PrijsZonderStatiegeld <> 0D) Then
                    sjabloonRij.SetCelTekst("omschrijving", _verkoopsDetail.Omschrijving)
                    sjabloonRij.SetCelTekst("prijs", _verkoopsDetail.PrijsZonderStatiegeld.ToString("c"))
                    sjabloonRij.SetCelTekst("aantal", _verkoopsDetail.Aantal.ToString())
                    sjabloonRij.SetCelTekst("totaal", _verkoopsDetail.TotaalPrijsZonderStatiegeld.ToString("c"))
                    sjabloonRij.SetCelTekst("btw", String.Format("{0}%", _verkoopsDetail.BTW))
                    top = _document.PrintRij(sjabloonRij, top)
                End If

                If (_verkoopsDetail.AfTeDrukkenStatiegeldPerStuk <> 0D) Then
                    If (_verkoopsDetail.TotaalPrijsZonderStatiegeld = 0D) Then
                        sjabloonRij.SetCelTekst("omschrijving", _verkoopsDetail.Omschrijving)
                    Else
                        sjabloonRij.SetCelTekst("omschrijving", "Leeggoed " & _verkoopsDetail.Omschrijving)
                    End If
                    sjabloonRij.SetCelTekst("prijs", _verkoopsDetail.AfTeDrukkenStatiegeldPerStuk.ToString("c"))
                    sjabloonRij.SetCelTekst("aantal", _verkoopsDetail.Aantal.ToString())
                    sjabloonRij.SetCelTekst("totaal", _verkoopsDetail.TotaalAfTeDrukkenStatiegeld.ToString("c"))
                    sjabloonRij.SetCelTekst("btw", "0%")
                    top = _document.PrintRij(sjabloonRij, top)
                End If

                Return top
            End Function

        End Class

    End Class

End Namespace
